//
//  HPUserAccountViewModel.swift
//  MyWeibo
//
//  Created by Apeng on 16/4/12.
//  Copyright © 2016年 Apengpeng. All rights reserved.
// 封装网络请求的数据

import UIKit

private let userInforKey = "userInforDict"

 // ViewModel 的作用时为外界提供数据, 是单例

class HPUserAccountViewModel: NSObject {

    static let sharedUserAccountViewModel: HPUserAccountViewModel = HPUserAccountViewModel()

    // 定义变量,, 解决频繁从磁盘读取数据
    var userAccount: HPUserAccount?
    
    // 添加计算属性,用户是否登录, 如果token没过期并且access-token 不为空则登录
    var isLogin: Bool {
        //使用 where 语句来增加额外的判断, 前半部分判断是否存在,
        if let u = userAccount where u.expires_Date?.compare(NSDate()) == NSComparisonResult.OrderedDescending {
            
            return true
        }
        //已经过期或者未登录, 不需要模型数据
        userAccount = nil
        return false
    }
    // 头像属性
    var iconImageURL: NSURL? {
        let url = NSURL(string: userAccount?.avatar_large ?? "")
        return url
    }
    
    
    // 私有化构造函数, 实现真正的单例,不让外界去访问
    private override init() {
        super.init()
        // 从沙盒中读取数据后赋值给全局变量, 以后就会从内存中读取数据
        userAccount = self.loadUserAccountInfo()
    }
}


// 获取授权码
extension HPUserAccountViewModel {
    
    // 使用闭包 回调, 只需要是否登录成功的结果
    func getAccessTokenByCode(code: String, finished: (isSuccess: Bool) -> ()) {
        
        // 调用网络请求中的封装方法来发送请求
        HPNetworkingTools.sharedTools.getAccessTokenByCode(code) { (result, error) -> () in
            
            if error != nil {
                print("错误", error)
                
                finished(isSuccess: false)
                return
            }
            
            // 成功时
            print("授权成功",result)
            
            // 获取用户的信息,结果包含在result 中
            self.getUserInfo(result!, finished: finished)
        }
    }
}



// 封装用户登陆
// 获取用户的信息 使用用户接口API文档 GET请求,返回JSON
//使用的URL: https://api.weibo.com/2/users/show.json
// 请求参数:access_token  必选参数  uid , screen_name 两者选其一
// 返回的字段: 用户的基本信息(包含很多)
extension HPUserAccountViewModel {
    private func getUserInfo(tokenResult: AnyObject, finished: (isSuccess: Bool) -> ()) {
        
        // 将返回的JSON格式数据 转为字典
        guard let dict = tokenResult as? [String:AnyObject] else {
            finished(isSuccess: false)
            return
        }
        
        // 反序列化成功后
        //通过accessToken 拿到token 的值, 强制解包安全
        let token = dict["access_token"]!
        let uid = dict["uid"]!
    
        // 使用NetWorkingTool工具来请求网络数据
        HPNetworkingTools.sharedTools.loadUserAccountInfo(token, uid: uid) { (result, error) -> () in
            
        if error != nil {
            print("reson", error)
            finished(isSuccess: false)
            return
        }
        
        print("getUserInfoSuccessed!")
        // 将返回的有用的数据反序列化为字典, 因为是text/plain格式, AFN不会自动转化
        guard var userInfoDict = result as? [String:AnyObject] else {
            finished(isSuccess: false)
            return
        }
        
        //为了用户体验, 需要把获取的某些参数保存到沙河中去, 以上两个字典中都有有用的数据, 需要合并
        // 遍历键值少的字典
        for (key, value) in dict {
            //写入可变字典中去
            userInfoDict[key] = value
        }
        
        // 保存数据到沙盒
        self.savedUserAccountInfo(userInfoDict)
        
        // 保存完毕后会调
        finished(isSuccess: true)
        
        }
    }
}



// 封装 数据的存储和读取
extension HPUserAccountViewModel {
    
    func savedUserAccountInfo(userInfoDict: [String:AnyObject]) {
        
        // 将保存的字典转模型
        let userAccount = HPUserAccount(dict: userInfoDict)
        
        // 赋值给单例模型
        self.userAccount = userAccount
        
        //获取字典指定key的信息
        let keys = ["access_token","avatar_large","name","expires_in","uid", "expires_Date"]
        // 根据模型对象的key值获取字典信息
        let userAccountInfoDict = userAccount.dictionaryWithValuesForKeys(keys)
        
        // 保存模型到沙盒
        let userDefaults = NSUserDefaults.standardUserDefaults()
        userDefaults.setObject(userAccountInfoDict, forKey: userInforKey)
        //同步
        userDefaults.synchronize()
        
    }
    
    func loadUserAccountInfo() -> HPUserAccount? {
        
        // 1, 获取字典信息
        guard let dict = NSUserDefaults.standardUserDefaults().objectForKey(userInforKey) as? [String:AnyObject] else {
            return nil // 要return 返回值必须是可选项
        }
        
        // 2, 将字典转为模型
        let userAccount = HPUserAccount(dict: dict)
        return userAccount
    }
}
